同樣的相關設定可以參照前面一篇的RS232,這邊比較需要注意的是 RS485 有三隻腳, D+ D- DIR,DIR 又分為軟硬體,這邊我建議是直接找硬體的腳位來做DIR比較快。
同樣是由 pinctrl 這個控制器在控制的,所以我們要先在 pinctrl 定義好分組。
uart9_pins_mx: uart9_mx-0 {
pins1 {
pinmux = <STM32_PINMUX('G', 8, AF6)>; /* UART9_TX */
bias-disable;
drive-push-pull;
slew-rate = <0>;
};
pins2 {
pinmux = <STM32_PINMUX('I', 5, AF6)>; /* UART9_RX */
bias-disable;
drive-push-pull;
};
pins3 {
pinmux = <STM32_PINMUX('I', 11, AF6)>; /* UART9_DIR */
bias-disable;
drive-push-pull;
slew-rate = <0>;
};
};
uart9_idle_pins_mx: uart9_idle_mx-0 {
pins1 {
pinmux = <STM32_PINMUX('G', 8, ANALOG)>; /* UART9_TX */
};
pins2 {
pinmux = <STM32_PINMUX('I', 5, AF6)>; /* UART9_RX */
bias-disable;
drive-push-pull;
};
pins3 {
pinmux = <STM32_PINMUX('I', 11, AF6)>; /* UART9_DIR */
bias-disable;
drive-push-pull;
slew-rate = <0>;
};
};
uart9_sleep_pins_mx: uart9_sleep_mx-0 {
pins {
pinmux = <STM32_PINMUX('G', 8, ANALOG)>, /* UART9_TX */
<STM32_PINMUX('I', 5, ANALOG)>, /* UART9_RX */
<STM32_PINMUX('I', 11, ANALOG)>; /* UART9_DIR */
};
};
同樣後面的 AF6
是替代功能,參照spec可以看到相關的說明。
接下來我們要寫 uart9 的功能定義了,在 pinctrl 當中只是在定義腳位分組與功能選用
&uart9 {
pinctrl-names = "default", "idle", "sleep";
pinctrl-0 = <&uart9_pins_mx>;
pinctrl-1 = <&uart9_idle_pins_mx>;
pinctrl-2 = <&uart9_sleep_pins_mx>;
status = "okay";
linux,rs485-enabled-at-boot-time;
rs485-rts-active-high;
uart-has-rtscts;
};
先設定 BaudRate 485 相關設定
stty -F /dev/ttySTM2 115200 cs8 -cstopb -parenb
printf '\xFE' > /dev/ttySTM2
stty -F /dev/ttySTM2 115200